package com.anlu.thread.t2;

import java.util.Arrays;
import java.util.List;

/**
 * Stream是java8中新增加的一个特性,被Java猿统称为流.
 *
 * Stream 不是集合元素，它不是数据结构并不保存数据，它是有关算法和计算的，它更像一个高级版本的 Iterator。原始版本的 Iterator，用户只能显式地一个一个遍历元素并对其执行某些操作；高级版本的 Stream，用户只要给出需要对其包含的元素执行什么操作，比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等，Stream 会隐式地在内部进行遍历，做出相应的数据转换。
 *
 * Stream 就如同一个迭代器（Iterator），单向，不可往复，数据只能遍历一次，遍历过一次后即用尽了，就好比流水从面前流过，一去不复返。
 *
 * 而和迭代器又不同的是，Stream 可以并行化操作，迭代器只能命令式地、串行化操作。顾名思义，当使用串行方式去遍历时，每个 item 读完后再读下一个 item。而使用并行去遍历时，数据会被分成多个段，其中每一个都在不同的线程中处理，然后将结果一起输出。Stream 的并行操作依赖于 Java7 中引入的 Fork/Join 框架（JSR166y）来拆分任务和加速处理过程。Java 的并行 API 演变历程基本如下：
 *
 * 1.0-1.4 中的 java.lang.Thread
 * 5.0 中的 java.util.concurrent
 * 6.0 中的 Phasers 等
 * 7.0 中的 Fork/Join 框架
 * 8.0 中的 Lambda
 *
 * parallelStream其实就是一个并行执行的流.它通过默认的ForkJoinPool,可能提高你的多线程任务的速度.
 */
public class StreamDemo {
    public static void main(String[] args){
        List<Integer> values = Arrays.asList(10,20,39,40);
        int res = new StreamDemo().add(values);
        System.out.println("结果是:"+res);
    }

    public int add(List<Integer> values){
        return values.parallelStream().mapToInt(i->i*2).sum();
    }
}
